package com.atguigu.srb.base.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class RedisConfig {
    /**
     * 配置RedisTemplate（核心操作类）
     * 自定义序列化方式，避免默认JDK序列化导致的乱码问题
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        // 字符串序列化器（用于key）
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        // JSON序列化器（用于value，支持对象自动序列化/反序列化）
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();

        // 设置key、hashKey的序列化方式
        template.setKeySerializer(stringSerializer);
        template.setHashKeySerializer(stringSerializer);

        // 设置value、hashValue的序列化方式
        template.setValueSerializer(jsonSerializer);
        template.setHashValueSerializer(jsonSerializer);

        template.afterPropertiesSet(); // 初始化
        return template;
    }

    /**
     * 配置Redis缓存管理器（用于Spring Cache注解，如@Cacheable）
     * 可设置全局缓存过期时间，或针对不同缓存名配置不同过期时间
     */
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 全局默认缓存配置
        RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30)) // 全局默认过期时间30分钟
                .disableCachingNullValues(); // 不缓存null值

        // 针对特定缓存名的个性化配置（如"userCache"过期时间1小时）
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("userCache", defaultConfig.entryTtl(Duration.ofHours(1)));
        configMap.put("orderCache", defaultConfig.entryTtl(Duration.ofMinutes(10)));

        // 创建缓存管理器
        return RedisCacheManager.builder(connectionFactory).cacheDefaults(defaultConfig) // 应用全局配置
                .withInitialCacheConfigurations(configMap) // 应用个性化配置
                .build();
    }
}
